package 符号表和作用域;

import java.util.Map;

public abstract class 作用域符号 extends 符号 implements 作用域 {
    public 作用域符号(String 名称) {
        super(名称);
    }

    作用域 外围作用域;

    public 作用域符号(String 名称, 作用域 外围作用域) {
        super(名称);
        this.外围作用域 = 外围作用域;
    }

    @Override
    public String 取作用域名() {
        return 名称;
    }

    @Override
    public 作用域 取外围作用域() {
        return 外围作用域;
    }

    public 作用域 取父作用域() {
        return 取外围作用域();
    }

    @Override
    public void 定义(符号 符号) {
        取所有成员().put(符号.取名称(), 符号);
        符号.作用域 = this;
    }

    @Override
    public 符号 解析(String 符号名) {
        var 符号 = 取所有成员().get(符号名);
        if (符号 != null) return 符号;
        if (取外围作用域() != null) {
            return 取外围作用域().解析(符号名);
        }
        return null;
    }

    public abstract Map<String, 符号> 取所有成员();
}
